package taillog

import (
	"fmt"
	"github.com/go-gin-admin/pkg/kafka"
	"github.com/hpcloud/tail"
)

// 专门从日志收集模块

type TailTask struct {
	path     string     // 日志路径
	topic    string     // 日志主题
	instance *tail.Tail // 当前日志任务实例
}

// 实例化一个任务日志
func NewTailTask(path, topic string) (tailTask *TailTask) {
	task := &TailTask{
		path:  path,
		topic: topic,
	}
	task.init()
	// 初始化日志
	return
}

// 初始化日志
func (t *TailTask) init() {
	config := tail.Config{
		// 从文件的哪个地方开始读
		Location: &tail.SeekInfo{
			Offset: 0,
			Whence: 0,
		},
		ReOpen:    true, // 重新打开
		MustExist: false,
		Poll:      true,
		Follow:    true, // 是否跟随
	}
	var err error
	t.instance, err = tail.TailFile(t.path, config)
	if err != nil {
		fmt.Printf("tail file failed, err : %s\n", err)
		return
	}
	go t.startTailTask() // 启动采集日志任务，发送kafka
}

// 执行日志任务
func (t *TailTask) startTailTask() {
	// 阻塞任务
	for {
		// 读取channel中的信息
		select {
		// 从tail实例通道中读取日志
		case line := <-t.instance.Lines:
			// 现将日志发送到channel中
			kafka.SendToLogDataChan(t.topic, line.Text)
			//fmt.Println("发送日志", line.Text)
		}
	}
}
